#include "widget.h"
#include "ui_widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 创建线程对象
    my_thread = new myThread; // 不能指定父对象，因为后面需要将自定义线程移动到我们创建的子线程中，移动到子线程中就相当于子线程成为了自定义线程的父对象

    // 创建子线程
    thread = new QThread(this);
    // 把自定义的线程加入到子线程中
    my_thread->moveToThread(thread);

    // 处理自定义线程发送的信号
    connect(my_thread, &myThread::my_signal, this, &Widget::dealsignal);
    qDebug() << "main thread id == " << QThread::currentThread();

    connect(this, &Widget::startThread, my_thread, &myThread::my_timeout); // 此链接就是典型的信号和槽函数所在线程不一样
    connect(this, &Widget::destroyed, this, &Widget::dealClose);

    // 线程函数内部不允许操作图形界面
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_start_clicked()
{
    if (thread->isRunning() == true) {
        return;
    }
    // 启动线程，但是没有启动线程处理函数
    thread->start();
    my_thread->setIsRunning(true);
    // 但是不能直接调用线程处理函数
    // 直接调用会导致线程处理函数会和主线程处于同一个线程
    // my_thread->my_timeout();

    // 只有通过signal ---> slot方式调用
    emit startThread();

}

void Widget::on_pushButton_stop_clicked()
{
    if (thread->isRunning() == false) {
        return;
    }
    // 先让子线程停止手头工作
    my_thread->setIsRunning(false);
    thread->quit();
    thread->wait();
//    delete my_thread;
//    delete thread;
}

void Widget::dealsignal()
{
    static int i = 0;
    i++;
    ui->lcdNumber->display(i);

}

void Widget::dealClose()
{
    // 先让子线程停止手头工作
    my_thread->setIsRunning(false);
    thread->quit();
    thread->wait();
    delete thread;
    delete my_thread;
}
